<?php

declare (strict_types=1);

namespace randy\tools\units;

/**
 * 常用数组扩展
 * Class ExtendArray
 *
 * @package utils
 */
class ExtendArray
{
    /**
     * 移除一维数组指定键值
     *
     * @param array $array
     * @param array $keys
     *
     * @return array
     * @author : Randy_chen
     * @Date   : 2020/4/22
     * @Time   : 13:31
     */
    static function removeKeys(array $array, array $keys)
    {
        return array_diff_key($array, array_flip($keys));
    }

    /**
     * 二维数据按照某个字段排序
     *
     * @param array  $array
     * @param string $keys
     * @param int    $sort
     *
     * @return mixed
     * @author : Randy_chen
     * @Date   : 2020/4/20
     * @Time   : 15:15
     */
    static function arraySort(array $array, string $keys, int $sort = SORT_DESC) : array
    {
        $keysValue = [];
        foreach ($array as $k => $v) {
            $keysValue[$k] = $v[$keys];
        }
        array_multisort($keysValue, $sort, $array);
        return $array;
    }

    /**
     * 获取二维数组指定多列
     *
     * @param array $input       //原数组
     * @param array $column_keys //指定key数组
     *
     * @return array
     * @author : Randy_chen
     * @Date   : 2020/4/20
     * @Time   : 15:23
     */
    static function arrayColumns(array $input, array $column_keys = []) : array
    {
        $result = [];
        foreach ($input as $v) {
            $tmp = self::newOnlyKeys($v, $column_keys);
            $result[] = $tmp;
        }
        return $result;
    }

    /**
     * 获取一维数组指定key
     *
     * @param array $array
     * @param array $keys
     *
     * @return array
     * @author : Randy_chen
     * @Date   : 2020/4/22
     * @Time   : 13:32
     */
    static function newOnlyKeys(array $array, array $keys) : array
    {
        return array_intersect_key($array, array_flip($keys));
    }

    /**
     * @param array  $list  要转换的结果集
     * @param string $pid   parent标记字段
     * @param string $level level标记字段
     */
    static function listToTree($list, $pk = 'id', $pid = 'pid', $child = 'child', $root = 0)
    {
        //创建Tree
        $tree = [];

        if (is_array($list)) {
            //创建基于主键的数组引用
            $refer = [];

            foreach ($list as $key => $data) {
                $refer[$data[$pk]] = &$list[$key];
            }

            foreach ($list as $key => $data) {
                //判断是否存在parent
                $parantId = $data[$pid];

                if ($root == $parantId) {
                    $tree[] = &$list[$key];
                } else {
                    if (isset($refer[$parantId])) {
                        $parent = &$refer[$parantId];
                        $parent[$child][] = &$list[$key];
                    }
                }
            }
        }

        return $tree;
    }

    /*
    * 将list_to_tree的树还原成列表
    * @param  array $tree  原来的树
    * @param  string $child 孩子节点的键
    * @param  string $order 排序显示的键，一般是主键 升序排列
    * @param  array  $list  过渡用的中间数组，
    * @return array        返回排过序的列表数组
    * @author yangweijie
    */
    static function treeToList($tree, $child = '_child', $order = 'id', &$list = [])
    {
        if (is_array($tree)) {
            $refer = [];

            foreach ($tree as $key => $value) {
                $reffer = $value;

                if (isset($reffer[$child])) {
                    unset($reffer[$child]);

                    self::treeToList($value[$child], $child, $order, $list);
                }

                $list[] = $reffer;
            }
            //            $list = self::treeToList($list, $order, $sortby = 'asc');
        }
        return $list;
    }

    static function getAllChild($array, $id, $pk = 'id', $pid = 'pid')
    {
        $arr = [];
        foreach ($array as $v) {
            if ($v[$pid] == $id) {
                $arr[] = $v[$pk];
                $arr = array_merge($arr, self::getAllChild($array, $v[$pk], $pk, $pid));
            };
        };
        return $arr;
    }
}